home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / KORG / MIDIIO.HPP < prev    next >
C/C++ Source or Header  |  1996-11-01  |  13KB  |  401 lines

  1. #ifndef __MIDIIO__
  2. #define __MIDIIO__
  3.  
  4. #include <stdio.h>
  5.  
  6. #ifndef MIDI_BUFSIZE
  7. #define MIDI_BUFSIZE  1024
  8. #endif
  9.  
  10. // opening modes of a midi file
  11. #ifdef __MSDOS__
  12. #define WRITE_BINARY  "wb"
  13. #define READ_BINARY   "rb"
  14. #else
  15. #define WRITE_BINARY  "w"
  16. #define READ_BINARY   "r"
  17. #endif
  18.  
  19. const unsigned long MThd = 0x4D546864ul;
  20. const unsigned long MTrk = 0x4D54726Bul;
  21.  
  22. // different standard midi formats
  23. #define VERSION_MULTICHANNEL   0
  24. #define VERSION_SINGLECHANNEL  1
  25. #define VERSION_MULTISONG      2
  26.  
  27. #define OPTION_NOCONTROLS   1    // no control details but general information
  28. #define OPTION_NOEVENTS     2    // no track events at all
  29. #define OPTION_NOMETAEVENTS 4    // no meta details but general information
  30. #define OPTION_NOSYSEVENTS  8    // no sysex details but general information
  31. #define OPTION_NONOTEEVENTS 16   // no note events (8x or 9x)
  32. #define OPTION_NOPOLYEVENTS 32   // no poly aftertouch events (Ax)
  33. #define OPTION_NOCONTROLEVENTS 64 // no control events at all (Bx)
  34. #define OPTION_NOPROGRAMEVENTS 128 // no program change events (Cx)
  35. #define OPTION_NOAFTERTOUCHEVENTS 256 // no aftertouch events (Dx)
  36. #define OPTION_NOPITCHBENDEVENTS 512 // no pitchbend events (Ex)
  37. #define OPTION_NOREALTIMEEVENTS  1024 // no realtime events (Fx)
  38.  
  39. // getchannel delivers a valid channel or:
  40. #define NOCHANNEL     (-1)
  41. #define MULTICHANNEL  (-2)
  42. #define VALIDCHANNEL(ch)  ((ch) >= 0 && (ch) <= 15)
  43. #define gm_drumchannel 9
  44. #define SAYCHANNEL(ch)  ((ch) + 1) // 0..15 in midi format but spoken 1..16!
  45.  
  46. // for use of param what in function text()
  47. #define meta_text       1
  48. #define meta_copyright  2
  49. #define meta_trackname  3
  50. #define meta_instrument 4
  51. #define meta_lyric    5
  52. #define meta_marker    6
  53. #define meta_cuepoint    7
  54. #define meta_endtrack   0x2f
  55.  
  56. #define ctrl_highbank 0
  57. #define ctrl_wheel 1
  58. #define ctrl_breath 2
  59. #define ctrl_foot 4
  60. #define ctrl_portamentotime 5
  61. #define ctrl_data 6
  62. #define ctrl_volume 7
  63. #define ctrl_balance 10
  64. #define ctrl_expression 11
  65. #define ctrl_lowbank 32
  66. #define ctrl_hold 64
  67. #define ctrl_reverb 91
  68. #define ctrl_chorus 93
  69. #define ctrl_datainc 96
  70. #define ctrl_datadec 97
  71. #define ctrl_lowrpn  100
  72. #define ctrl_highrpn 101
  73.  
  74. #define balance_left   0
  75. #define balance_center 64
  76. #define balance_right  127
  77.  
  78. #define volume_mute    0
  79. #define volume_full    127
  80.  
  81. #define bpm(ticks)     (60000000.0 / (ticks))
  82. #define ticks(beats)   ((unsigned long)(60000000.0 / (beats)))
  83.  
  84. #define tempo_60bpm    (1000000L)
  85. #define tempo_120bpm   (500000L)
  86. #define tempo_240bpm   (250000L)
  87.  
  88. #define pitchbend_maxdown  0x0000
  89. #define pitchbend_center   0x2000
  90. #define pitchbend_maxup    0x3fff
  91.  
  92. class MidiRead
  93. {
  94. public:
  95.   static const char* copyright();
  96.  
  97.   MidiRead(const char* filename, FILE* f = 0);
  98.   virtual ~MidiRead();
  99.  
  100.   FILE* getf();
  101.  
  102.   int run();
  103.   int runhead();
  104.   int runtrack(int trackno);
  105.   int runevent(long trackend);
  106.  
  107.   long getpos() { return pos_; }
  108.   long geteventpos() { return pos_; }
  109.   long getcurpos() { return curpos_; }
  110.   unsigned long getcurtime() { return curtime_; } // in midi units
  111.  
  112.   virtual void head(unsigned version, unsigned tracks, unsigned clicksperquarter);
  113.   virtual void track(int trackno, long length, int channel);
  114.   virtual void endtrack(int trackno); // closing track
  115.  
  116.   virtual void time(unsigned long ticks); // delay between events
  117.  
  118.   virtual void event(int what, int len = 0, unsigned char* data = 0);
  119.  
  120.   // these are event categories:
  121.     virtual void meta(int what, int len, unsigned char* data);
  122.     // these are special meta events:
  123.       virtual void text(int what, int len, char* whattext, unsigned char* txt);
  124.       virtual void end();  // end of track command
  125.       virtual void prefixchannel(unsigned char channel);
  126.       virtual void prefixport(unsigned char port);
  127.       virtual void seqnumber(unsigned int seqno);
  128.       virtual void smpteofs(int hour, int min, int sec, int frame, int fracframe);
  129.       virtual void tact(int nom, int denom, int clicksperbeat, int notes32perbeat);
  130.       virtual void tempo(unsigned long microsecperbeat);
  131.       virtual void key(int signature, int isminor); // C=0, -7=7flats +7=7sharps
  132.     virtual void program(int channel, int prg);
  133.     virtual void control(int channel, int what, int val); // general controls
  134.     // special controls:
  135.       virtual void highbank(int channel, int val);
  136.       virtual void wheel(int channel, int val);
  137.       virtual void breath(int channel, int val);
  138.       virtual void foot(int channel, int val);
  139.       virtual void portamentotime(int channel, int val);
  140.       virtual void data(int channel, int val);
  141.       virtual void volume(int channel, int val);
  142.       virtual void balance(int channel, int val);
  143.       virtual void expression(int channel, int val);
  144.       virtual void lowbank(int channel, int val);
  145.       virtual void hold(int channel, int val);
  146.       virtual void reverb(int channel, int val);
  147.       virtual void chorus(int channel, int val);
  148.       virtual void datainc(int channel, int val);
  149.       virtual void datadec(int channel, int val);
  150.       virtual void lowrpn(int channel, int val);
  151.       virtual void highrpn(int channel, int val);
  152.       virtual void pitchbendrange(int channel, int val);
  153.     virtual void noteon(int channel, int note, int vel);
  154.     virtual void noteoff(int channel, int note, int vel);
  155.     virtual void pitchbend(int channel, int val);
  156.     virtual void polyaftertouch(int channel, int note, int val);
  157.     virtual void aftertouch(int channel, int val);
  158.     virtual void songpos(unsigned pos);
  159.     virtual void songselect(unsigned char song);
  160.     virtual void tunerequest();
  161.     virtual void timingclock();
  162.     virtual void start();
  163.     virtual void cont();
  164.     virtual void stop();
  165.     virtual void activesense();
  166.     virtual void sysex(int syslen, unsigned char* sysdata);
  167.     // these are special sysex events:
  168.       virtual void xgreset();
  169.       virtual void gmreset();
  170.       virtual void gsreset();
  171.       virtual void gsexit();
  172.  
  173.   virtual void endmidi(); // after last track
  174.   virtual void error(const char* msg);
  175.   virtual void warning(const char* msg);
  176.  
  177.   virtual void percent(int perc);
  178.  
  179.   int getchannel() { return curchannel_; }
  180.   void setchannel(int channel);
  181.  
  182.   static const char* progname(int n, int channel);
  183.   static const char* notename(unsigned char note);
  184.  
  185.   int options_;
  186.  
  187.   int version_, tracks_, clicks_, trackno_;
  188.  
  189.   void seek(long pos);
  190.   int getbyte();
  191.   unsigned getword();
  192.   unsigned long gettri();
  193.   unsigned long getlong();
  194.   unsigned long getdelta();
  195.   unsigned char* get(int len);
  196.   unsigned char* need(int nbytes);
  197.  
  198.   unsigned long microsec(unsigned long units, unsigned long msperbeats);
  199.   long units(unsigned long microsec, unsigned long msperbeats);
  200.  
  201.   // use scanchannel only at start of track!
  202.   int scanchannel(unsigned long maxlen); // channel 0-15 or -1=no channel or -2=multichannels
  203.  
  204.   // use sysevent only directly after reading F0 or F7
  205.   int scansysevent(unsigned long maxlen);
  206.  
  207. protected:
  208.   const char *midiname_;
  209.   FILE* f_;
  210.   unsigned char shouldclose_; // 0=no, otherwise=yes
  211.   long filesize_;
  212.   unsigned char buf_[MIDI_BUFSIZE];
  213.   int buflen_, bufpos_;
  214.   int curchannel_;
  215.   unsigned long curtime_;
  216.   int percent_;
  217.   int lastcode_;
  218.   unsigned long tracklen_;
  219.  
  220.   long pos_, curpos_;
  221.   unsigned char curdeltalen_; // number of bytes read by recent getdelta() call
  222. };
  223.  
  224. class MidiWrite
  225. {
  226. public:
  227.   static const char* copyright();
  228.  
  229.   MidiWrite(const char* filename);
  230.   virtual ~MidiWrite();
  231.  
  232.   FILE* getf();
  233.  
  234.   long getcurpos() { return curpos_; }
  235.   long getcurtime() { return curtime_; }
  236.   void cleardelta();
  237.  
  238.   void head(int version = 1, int tracks = 0, unsigned clicksperquarter = 192);
  239.   void track();
  240.   void endtrack();
  241.  
  242.   void event(int what, int len, unsigned char* data);
  243.  
  244.   void text(int what, int len, unsigned char* txt);
  245.   void meta(int what, int len, unsigned char* data); // 0xff ....
  246.   virtual void prefixchannel(unsigned char channel);
  247.   virtual void prefixport(unsigned char port);
  248.   virtual void seqnumber(unsigned int seqno);
  249.   virtual void smpteofs(int hour, int min, int sec, int frame, int fracframe);
  250.   virtual void key(int signature, int isminor);
  251.   void tact(int nom, int denom, int v1, int v2);
  252.   void tempo(unsigned long microsecperbeat);
  253.   void end();
  254.   void program(int channel, int prg);
  255.   void control(int channel, int what, int val);
  256.   // these are special controls
  257.     void highbank(int channel, int val);
  258.     void wheel(int channel, int val);
  259.     void breath(int channel, int val);
  260.     void foot(int channel, int val);
  261.     void portamentotime(int channel, int val);
  262.     void data(int channel, int val);
  263.     void volume(int channel, int val);
  264.     void balance(int channel, int val);
  265.     void expression(int channel, int val);
  266.     void lowbank(int channel, int val);
  267.     void hold(int channel, int val);
  268.     void reverb(int channel, int val);
  269.     void chorus(int channel, int val);
  270.     void datainc(int channel, int val);
  271.     void datadec(int channel, int val);
  272.     void lowrpn(int channel, int val);
  273.     void highrpn(int channel, int val);
  274.     void pitchbendrange(int channel, int halfnotes);
  275.  
  276.   void noteon(int channel, int note, int vel);
  277.   void noteoff(int channel, int note, int vel = 0);
  278.   void time(unsigned long ticks);
  279.   void pitchbend(int channel, int val);
  280.   void polyaftertouch(int channel, int note, int val);
  281.   void aftertouch(int channel, int val);
  282.   void songpos(unsigned pos);
  283.   void songselect(unsigned char song);
  284.   void tunerequest();
  285.   void timingclock();
  286.   void start();
  287.   void cont();
  288.   void stop();
  289.   void activesense();
  290.   void sysex(int syslen, unsigned char* sysdata);
  291.   void xgreset();
  292.   void gmreset();
  293.   void gsreset();
  294.   void gsexit();
  295.  
  296.   void putbyte(unsigned char val);
  297.   void putcode(unsigned char code);
  298.   void putword(unsigned val);
  299.   void puttri(unsigned long val);
  300.   void putlong(unsigned long val);
  301.   void putdelta(unsigned long val);
  302.   void puttime();
  303.   void put(int len, unsigned char* c);
  304.   void seek(long pos);
  305.  
  306.   virtual void error(const char* msg);
  307.   virtual void warning(const char* msg);
  308.  
  309.   int unitsperquarter();
  310.  
  311. protected:
  312.   const char *midiname_;
  313.   FILE* f_;
  314.   long trackpos_, curpos_, filesize_;
  315.   int trackchannel_, trackcount_, lastcode_, endtrack_;
  316.  
  317.   unsigned char buf_[MIDI_BUFSIZE];
  318.   int bufpos_, buflen_;
  319.  
  320.   unsigned long curdelta_;
  321.   unsigned long curtime_;
  322.  
  323.   int clicks_;
  324.  
  325.   void flush();
  326. };
  327.  
  328.  
  329. class MidiCopy : public MidiRead
  330. {
  331. public:
  332.   MidiCopy(const char* filename, FILE* f = 0);
  333.  
  334.   void setoutput(MidiWrite* dest);
  335.   void stopoutput();
  336.   MidiWrite* getoutput();
  337.  
  338.   void mapchannel(int channel, int newchannel);
  339.   void ignorechannel(int channel);
  340.  
  341.   virtual void head(unsigned version, unsigned tracks, unsigned clicksperquarter);
  342.   virtual void track(int trackno, long length, int channel);
  343.   virtual void endtrack(int trackno);
  344.  
  345.   virtual void time(unsigned long ticks);
  346.  
  347.   virtual void event(int what, int len = 0, unsigned char* data = 0);
  348.  
  349.   virtual void meta(int what, int len, unsigned char* data);
  350.     virtual void text(int what, int len, char* whattext, unsigned char* txt);
  351.     virtual void end();
  352.     virtual void prefixchannel(unsigned char channel);
  353.     virtual void prefixport(unsigned char port);
  354.     virtual void seqnumber(unsigned int seqno);
  355.     virtual void smpteofs(int hour, int min, int sec, int frame, int fracframe);
  356.     virtual void tact(int nom, int denom, int clicksperbeat, int notes32perbeat);
  357.     virtual void tempo(unsigned long microsecperbeat);
  358.     virtual void key(int signature, int isminor); // C=0, -7=7flats +7=7sharps
  359.   virtual void program(int channel, int prg);
  360.   virtual void control(int channel, int what, int val);
  361.     virtual void highbank(int channel, int val);
  362.     virtual void wheel(int channel, int val);
  363.     virtual void breath(int channel, int val);
  364.     virtual void foot(int channel, int val);
  365.     virtual void portamentotime(int channel, int val);
  366.     virtual void data(int channel, int val);
  367.     virtual void volume(int channel, int val);
  368.     virtual void balance(int channel, int val);
  369.     virtual void expression(int channel, int val);
  370.     virtual void lowbank(int channel, int val);
  371.     virtual void hold(int channel, int val);
  372.     virtual void reverb(int channel, int val);
  373.     virtual void chorus(int channel, int val);
  374.     virtual void datainc(int channel, int val);
  375.     virtual void datadec(int channel, int val);
  376.     virtual void noteon(int channel, int note, int vel);
  377.     virtual void noteoff(int channel, int note, int vel);
  378.   virtual void pitchbend(int channel, int val);
  379.   virtual void polyaftertouch(int channel, int note, int val);
  380.   virtual void aftertouch(int channel, int val);
  381.   virtual void songpos(unsigned pos);
  382.   virtual void songselect(unsigned char song);
  383.   virtual void tunerequest();
  384.   virtual void timingclock();
  385.   virtual void start();
  386.   virtual void cont();
  387.   virtual void stop();
  388.   virtual void activesense();
  389.   virtual void sysex(int syslen, unsigned char* sysdata);
  390.     virtual void gmreset();
  391.     virtual void gsreset();
  392.     virtual void gsexit();
  393.     virtual void xgreset();
  394.  
  395. protected:
  396.   MidiWrite* dest_;
  397.   int mapchannel_[16];  // channel 0-15 or events are ignored for invalid channel
  398. };
  399.  
  400. #endif
  401.